import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

// 基于 Callable 实现 1+2+3+...+1000
// Callable（有返回值） 类似 Runnable（没有返回值）
public class Demo2 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for (int i = 1; i <= 1000; i++) {
                    sum += i;
                }
                return sum;
            }
        };

        // Thread 无法直接接收 Callable 对象作为参数. 此处需要搭配 FutureTask
        // FutureTask 里面有个run方法 调用了 callable 的call方法.  "call方法类似后厨加工麻辣烫"
        // Thread 的 run 调用 FutureTask 的 run
        // futureTask "号码牌" 是取出执行结果的依据，通过这个对象获取到未来的结果
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        Thread t = new Thread(futureTask); // FutureTask也实现了Runnable可以做为入参
        t.start();

        // get 方法拿到 call() 的返回结果.
        // 如果 call 还没有执行完, get 就会阻塞等待.
        System.out.println(futureTask.get());
    }



    // 创建线程, 让这个线程计算 1 + 2 + 3 + ... + 1000
    // 主线程在这个计算线程执行完毕后, 输出此线程的计算结果.
    private static int result = 0; // 通过成员变量，解决线程间数据交互的问题
    public static void main1(String[] args) throws InterruptedException {

        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                int sum = 0;
                for (int i = 1; i <= 1000; i++) {
                    sum += i;
                }
                result = sum;
            }
        });
        t.start();
        t.join();

        System.out.println(result);
    }
}
